package com.qykj.ddhing.pda.demo.dagger2.test2;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.qykj.ddhing.pda.common.LogUtil;
import com.qykj.ddhing.pda.R;

import javax.inject.Inject;


/**
 * @author liuxiaofeng QQ:363204195
 * @name ddhing_pda
 * @class name：com.qykj.ddhing.pda.demo.dagger2.test1
 * @class describe
 * @time 2018/7/18 22:19
 * @change
 * @chang time
 * @class describe
 */
public class TestDagger2Activity extends AppCompatActivity {
    @Inject
    User2 user2;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testdagger2);
        LogUtil.getLogUtil_LXF().d("getAppComponent().hashCode():"+ getAppComponent().hashCode());
        /*初始化依赖实例的步骤
        查找Module中是否存在创建该类型的方法（前提是@Conponent标记的接口中包含了@Module标记的Module类，如果没有则直接找@Inject对应的构造方法）
        若存在方法，查看该方法是否有参数
        1.若不存在参数，直接初始化该类的实例，一次依赖注入到此结束。
        2.若存在参数，则从步骤1开始初始化每个参数
        若不存在创建类方法，则查找该类型的类中有@Inject标记的构造方法，查看构造方法中是否有参数
        若构造方法中无参数，则直接初始化该类实例，一次依赖注入到此结束。
        若构造方法中有参数，从步骤1依次开始初始化每个参数。*/
        DaggerTestMainComponent.builder().mainModule(new MainModule()).build().inject(this);
        /*注意:
1.既没有@Module提供的实例，也没有@Inject标记的构造方法编译期就会报错。
2.若实例化时需要的参数没有提供，则实例化后值为null*/
        LogUtil.getLogUtil_LXF().d("user2.getName():"+ user2.getName());
        LogUtil.getLogUtil_LXF().d("getAppComponent().hashCode():"+ getAppComponent().hashCode());
    }
    /*这样就实现了一个常规意思上的单例，但是可以发现这个依赖实例其实只是每次都由同一个Component注入器对象提供，
    重新生成一个Component对象的话注入的依赖实例就不再是同一个。所以想要用Component只提供同一个实例对象，就必须保证Component只初始化一次。*/
    public static TestMainComponent component;
    public static TestMainComponent getAppComponent(){
        if (component == null) {
            component = DaggerTestMainComponent.builder()
                    .mainModule(new MainModule())
                    .build();
        }
        return component;
    }
}
